package sample;

import java.net.MalformedURLException;
import java.net.URL;
import java.text.ParseException;
import java.util.List;

import cn.DESedeTool;
import cn.Header;
import cn.SAGClientConfig;
import cn.eshore.bnet.sag.fax.ClientUtils;
import cn.eshore.bnet.sag.sms.DeliveryState;
import cn.eshore.bnet.sag.sms.GetStateResponse;
import cn.eshore.bnet.sag.sms.PolicyException_Exception;
import cn.eshore.bnet.sag.sms.ReceiveResponse;
import cn.eshore.bnet.sag.sms.SendResponse;
import cn.eshore.bnet.sag.sms.ServiceException_Exception;
import cn.eshore.bnet.sag.sms.Sms;
import cn.eshore.bnet.sag.sms.SmsMessage;
import cn.eshore.bnet.sag.sms.SmsService;



/**
 * 短信Demo。包括发送短信、查询短信状态、接收用户上行短信功能。
 * @author Jack  email:Jack_ymy@189.cn
 */
public class SMSDemo {
	private Sms port;

	public void init(String wsdlurl) throws MalformedURLException {
		URL wsdlURL = new URL(wsdlurl);
		SmsService ss = new SmsService(wsdlURL);
		port = ss.getSmsPort();
	}
	
	public static void main(String[] args) throws InterruptedException {
		try {
			String wsdlURL = "http://125.88.125.218/sag-server-sms/sms?wsdl";// 短信服务地址
			SAGClientConfig.si = "92";// SI帐号
			SAGClientConfig.password = "abcd1234";// 密码
			SAGClientConfig.sms_accessNumber = "1065902080001";// 接入号

			System.out.println("构建SOAP消息头Header（参数描述参考《广东商企平台能力开放接口协议-总册v0.1》）......");
			Header header = null;
			header = ClientUtils.createHeader(SAGClientConfig.si,
					SAGClientConfig.password, null, null, null, null,
					SAGClientConfig.sms_accessNumber, null);

			SMSDemo demo = new SMSDemo();
			demo.init(wsdlURL);
		
//测试发送短信（网内）。参考文档《广东商企平台能力开放接口协议-短信能力分册》7.1章节
		demo.send(header);
		
//测试发送短信（跨网）。参考文档《广东商企平台能力开放接口协议-短信能力分册》7.1章节
//		demo.send2(header);
		
//测试查询短信状态。参考文档《广东商企平台能力开放接口协议-短信能力分册》7.2章节
//		demo.getState(header, "80270");
		
//测试接收用户上行短信。参考文档《广东商企平台能力开放接口协议-短信能力分册》7.3章节
//		String receiver = "1065902080001";
//		demo.receive(header,receiver);
		
	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (ParseException e) {
		e.printStackTrace();
	} catch (PolicyException_Exception e) {
		System.out.println("ErrorCode : " + e.getErrorCode());
		System.out.println("ErrorMessage : " + e.getErrorMessage());
		e.printStackTrace();
	} catch (ServiceException_Exception e) {
		System.out.println("ErrorCode : " + e.getErrorCode());
		System.out.println("ErrorMessage : " + e.getErrorMessage());
	}
}
	
	/**
	 * 发送短信（下发短信） 网内短信
	 * @param header
	 */
	public String send(Header header) 
		throws PolicyException_Exception,ServiceException_Exception {
		System.out.println("构建SOAP消息体Body(参数描述参考《广东商企平台能力开放接口协议-短信能力分册v0.1》)......");
		cn.eshore.bnet.sag.sms.Send parameters = new cn.eshore.bnet.sag.sms.Send();
		String ext = "1234";// 可选，发送号码的扩展部分，SI可根据产品业务规则分配给不同客户使用
		parameters.setSender(SAGClientConfig.sms_accessNumber + ext);// sender长度必须小于等于21
		parameters.setCorrelator(System.currentTimeMillis() + ""); // SI生成并记录，回调通知发送结果时包含该信息。
		parameters.setContent("短信发送测试 smsContext");//短信发送内容
		parameters.getReceivers().add("18922296339");//只支持133、153、189开头的中国电信手机号码（C网），需要跨网请联系Jack_ymy@189.cn
//		parameters.getReceivers().add("153××××××××");//短信群发，接收号码最多12个。
		parameters.setNotifyUrl("http://125.88.125.218/sag-server-sms/siSmsNotification");// 需要改为SI自己的回调地址

		System.out.println("调用发送短信接口......");
		SendResponse response = port.send(parameters, header);
		System.out.println("requestId为" + response.getRequestId()
				+ "（可用于查询短信发送状态）");
		return response.getRequestId();
	
	}
	
	/**
	 * 发送短信（下发短信） 跨网短信
	 * @param header
	 */
	public String send2(Header header) 
		throws PolicyException_Exception,ServiceException_Exception {
		System.out.println("构建SOAP消息体Body(参数描述参考《广东商企平台能力开放接口协议-短信能力分册v0.1》)......");
		String customerNumber = ""; // 客户号码（宽乐帐号），暂不提供测试帐号，若需联调请联系Jack_ymy@189.cn
	    String customerNumberPwd = ""; // 客户号码的密码（宽乐密码）
		header.setCustomerNumber(customerNumber);
		// (timestamp+客户号码的密码)与(SI的密码的前8位)进行3DES加密 
		String signature = DESedeTool.encrypt(header.getTimestamp()
				+ customerNumberPwd, (SAGClientConfig.password+"0000").substring(0, 8));
		header.setCustomerNumberSignature(signature);
		
		cn.eshore.bnet.sag.sms.Send parameters = new cn.eshore.bnet.sag.sms.Send();
		parameters.setSender(customerNumber);// sender长度必须小于等于21
		parameters.setCorrelator(System.currentTimeMillis() + ""); // SI生成并记录，回调通知发送结果时包含该信息。
		parameters.setContent("跨网短信发送测试 smsContext");//短信发送内容
		parameters.getReceivers().add("18922296339");//支持跨网短信
//		parameters.getReceivers().add("153××××××××");//短信群发，接收号码最多12个。
		parameters.setNotifyUrl("http://125.88.125.218/sag-server-sms/siSmsNotification");//需要改为SI自己的回调地址

		System.out.println("调用发送短信接口......");
		SendResponse response = port.send(parameters, header);
		System.out.println("requestId为" + response.getRequestId()+ "（可用于查询短信发送状态）");
		return response.getRequestId();

	}
	
	/**
	 * 查询短信状态
	 * 
	 * @param header
	 * @param requestId
	 */
	public void getState(Header header, String requestId)
			throws PolicyException_Exception, ServiceException_Exception {
		System.out.println("构建SOAP消息体Body(参数描述参考《广东商企平台能力开放接口协议-短信能力分册v0.1》)......");
		cn.eshore.bnet.sag.sms.GetState parameters = new cn.eshore.bnet.sag.sms.GetState();
		parameters.setRequestId(requestId);

		System.out.println("调用查询短信状态接口......");
		GetStateResponse response = port.getState(parameters, header);
		if (response != null && response.getDeliveryState() != null
				&& response.getDeliveryState().size() > 0) {
			List<DeliveryState> stateList = response.getDeliveryState();
			for (DeliveryState state : stateList) {
				System.out.println("接收号为 " + state.getReceiver()
						+ " 的短信的发送状态为 " + state.getState() + "（状态码参考短信能力分册）");
			}
		} else {
			System.out.println("没有与requestId=" + requestId + "匹配的短信记录");
		}

	}
	
	/**
	 * 接收用户上行短信
	 * @param header
	 * @param receiver 接收号码
	 */
	public void receive(Header header, String receiver)
			throws PolicyException_Exception, ServiceException_Exception {
		System.out.println("构建SOAP消息体Body(参数描述参考《广东商企平台能力开放接口协议-短信能力分册v0.1》)......");
		cn.eshore.bnet.sag.sms.Receive parameters = new cn.eshore.bnet.sag.sms.Receive();
		parameters.setReceiver(receiver);// 接收者

		System.out.println("调用接收用户上行短信接口......");
		ReceiveResponse response = port.receive(parameters, header);
		if (response != null && response.getMessage() != null
				&& response.getMessage().size() > 0) {
			List<SmsMessage> messageList = response.getMessage();
			for (SmsMessage message : messageList) {
				System.out.println("sender:" + message.getSender()
						+ " receiver:" + message.getReceiver() + " content:"
						+ message.getContent());
			}
		} else {
			System.out.println("没有与receiver=" + receiver
					+ "匹配的短信记录，或者该记录已经被获取过，状态已改变，将不可再被获取。");
		}

	}
}
